"""
互斥锁:只有抢到锁的线程才能执行代码，没抢到锁的就等待
    线程执行结束以后，要记得把锁释放掉，这样别的线程才可以拿到岁
    lock = threading.Lock() 创建一把锁
    lock.acquire() 拿到锁
    lock.release() 释放锁

    线程执行任务结束之后就死亡了

互斥锁可以保证同一时刻只有一个线程去执行代码，能保证共享数据的安全
线程等待和互斥锁都是把多任务改成单任务去执行了，保证了数据安全，但是降低了性能

"""

import threading


# 全局变量
total = 0

# 创建互斥锁
lock = threading.Lock()

def addOne():
    lock.acquire() # 拿到锁
    for i in range(100*10000):
        # 注意共享变量total是不可变的，因此使用global修改共享变量的地址
        global  total
        total += 1
    print("执行结果："+str(total))
    lock.release() # 释放锁

# 每次运行的结果都不同，但是明显都小于200W
if __name__ == '__main__':
    t1 = threading.Thread(target=addOne)
    t1.start()
    #t1.join()

    t2 = threading.Thread(target=addOne)
    t2.start()

